home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル応用編
/
簡易エディタ
/
SEESE.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
17KB
|
542 lines
/******************************************************************************
* seese.c: ファイル名入力用疑似ダイアログ関数モジュール
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "sedit.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* openEseDlg(): 疑似ダイアログのオープン
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* Window *winPtr ウィンドウポインタ
* char *title ダイアログタイトルへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
* 注釈:
* 疑似ダイアログのワークを初期化する。
* 疑似ダイアログの表示はshowEseDlg()で行う。
*/
BOOLEAN openEseDlg(EseDlg *pese, Window *winPtr, char *title)
{
/* 疑似ダイアログの各種座標 */
static Rect rcFrame = { /* 外枠 */
ESE_X + 0, ESE_Y + 0, ESE_X + 321, ESE_Y + 104
};
static Rect rcText = { /* テキスト入力欄 */
ESE_X + 13, ESE_Y + 30, ESE_X + 305, ESE_Y + 58
};
static Rect rcPart = { /* 文字ボタンのパーティション */
ESE_X + 218, ESE_Y + 67, ESE_X + 301, ESE_Y + 97
};
/* ダイアログタイトルの表示位置 */
static Point ttlPos = { ESE_X + 15, ESE_Y + 15 };
pese->windowPtr = winPtr;
pese->rcFrame = rcFrame; /* 外枠レクタングルの登録 */
pese->rcText = rcText; /* テキストエディット用のレクタングル */
pese->rcDest = rcText;
pese->rcPart = rcPart; /* 文字ボタンを囲むレクタングル */
pese->ttlPos = ttlPos; /* タイトル表示座標 */
pese->visible = 0;
pese->title = MMChHdlNew(256); /* タイトル文字列用ハンドルを確保する */
if (pese->title == NULL)
return FALSE;
strcpy(*pese->title, title); /* タイトルを設定する */
if (!createEseText(pese)) /* テキストエディットを作成する */
return FALSE;
if (!createEseControl(pese)) /* コントロールを作成する */
return FALSE;
return TRUE;
}
/******************************************************************************
* closeEseDlg(): 疑似ダイアログのクローズ
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 注釈:
* 疑似ダイアログを消去し、確保しているコントロールハンドルなど、すべて廃
* 棄します。
*/
void closeEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (pese->visible) {
GMSetGraph(&pese->windowPtr->graph);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
releaseClip(pese->windowPtr);
GMFillRect(&pese->rcFrame);
addUpdate(pese->windowPtr, &pese->rcFrame);
GMAPage(lastAP);
GMForeColor(lastFC);
}
if (pese->tEditHdl != NULL) {
/* テキストエディットハンドルを廃棄する */
TMDispose(pese->tEditHdl);
pese->tEditHdl = NULL;
}
if (pese->execBtnHdl != NULL) {
CMDispose(pese->execBtnHdl);
pese->execBtnHdl = NULL;
}
if (pese->canBtnHdl != NULL) {
CMDispose(pese->canBtnHdl);
pese->canBtnHdl = NULL;
}
MMHdlDispose(pese->title); /* ハンドルを解放する */
pese->title = NULL;
}
/******************************************************************************
* drawEseDlg(): 疑似ダイアログの描画
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void drawEseDlg(EseDlg *pese)
{
int lastAP, lastFC, lastBC, lastFK;
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_LGRAY);
lastFK = GMFontKind(G_ROM12);
GMScrewRect(&pese->rcFrame); /* ネジ付レクタングルを表示する */
GMShadowRect(&pese->rcPart);
CMDrawOne(pese->execBtnHdl); /* ボタンを描画する */
CMDrawOne(pese->canBtnHdl);
MMHdlLock(pese->title);
GMShadowStrZ(*pese->title, pese->ttlPos.x_y); /* ボタンを描画する */
MMHdlUnlock(pese->title);
GMBackColor(G_WHITE);
GMShadowRect(&pese->rcText);
/* テキストエディットの文字列を描画する */
TMUpDate(pese->tEditHdl, &pese->rcText);
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame);
}
/******************************************************************************
* showEseDlg(): 疑似ダイアログの表示
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void showEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (pese->visible)
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
GMPenHide();
CMShow(pese->execBtnHdl);
CMShow(pese->canBtnHdl);
GMPenShow();
TMShow(pese->tEditHdl);
pese->visible = TRUE;
GMAPage(lastAP);
GMForeColor(lastFC);
addUpdate(pese->windowPtr, &pese->rcFrame);
setClip(pese->windowPtr, &pese->rcFrame);
}
/******************************************************************************
* hideEseDlg(): 疑似ダイアログの消去
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void hideEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
releaseClip(pese->windowPtr);
pese->visible = FALSE;
CMHide(pese->execBtnHdl);
CMHide(pese->canBtnHdl);
TMHide(pese->tEditHdl);
GMFillRect(&pese->rcFrame);
addUpdate(pese->windowPtr, &pese->rcFrame);
GMAPage(lastAP);
GMForeColor(lastFC);
}
/******************************************************************************
* createEseText(): 疑似ダイアログ用テキストエディットの作成
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN createEseText(EseDlg *pese)
{
int errCode;
/* テキストエディット用ディスティネーションレクタングルを作成する */
pese->rcDest.d.left++;
pese->rcDest.d.top++;
pese->rcDest.d.right -= 2;
pese->rcDest.d.bottom -= 2;
errCode = TMNew2(&pese->rcDest, &pese->rcDest, &pese->windowPtr->graph, &pese->tEditHdl);
if (errCode < 0)
/* テキストエディットが作成できなかった */
return FALSE;
(*pese->tEditHdl)->lenMax = TS_NAMEMAX; /* 入力最大文字数を設定する */
(*pese->tEditHdl)->lineHeight = T_LHEIGHT; /* 改行幅を設定する */
(*pese->tEditHdl)->editMode = 0; /* 編集モードを通常表示にする */
/* ファンクションキーアサインテーブルを設定する */
(*pese->tEditHdl)->funcCode = funcKeyTbl;
return TRUE;
}
/******************************************************************************
* createEseControl(): 疑似ダイアログ上のコントロールの作成
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN createEseControl(EseDlg *pese)
{
static Rect rcExecBtn = { /* [実行]ボタン */
ESE_X + 224, ESE_Y + 73, ESE_X + 224 + CHRBTN_H + 12 * 2, ESE_Y + 73 + CHRBTN_V
};
static Rect rcCanBtn = { /* [取消]ボタン */
ESE_X + 266, ESE_Y + 73, ESE_X + 266 + CHRBTN_H + 12 * 2, ESE_Y + 73 + CHRBTN_V
};
pese->execBtnHdl = CMOpen(pese->windowPtr, &rcExecBtn,
(_LASCII)"\x04実行", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
if (pese->execBtnHdl == NULL)
return FALSE;
pese->canBtnHdl = CMOpen(pese->windowPtr, &rcCanBtn,
(_LASCII)"\x04取消", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
if (pese->canBtnHdl == NULL)
return FALSE;
return TRUE;
}
/******************************************************************************
* caretEseDlg(): 疑似ダイアログのカーソル制御
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* BOOLEAN sw = TRUE: 表示
* = FALSE: 消去
*/
void caretEseDlg(EseDlg *pese, BOOLEAN sw)
{
int lastAP, lastFC, lastBC, lastFK;
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr); /* クリッピングを解除する */
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_WHITE);
lastFK = GMFontKind(G_ROM12);
TMCaret(pese->tEditHdl, sw); /* カーソルをオン/オフする */
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame); /* クリッピングを戻す */
}
/******************************************************************************
* eseDlgEvent(): イベントに応じた処理
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* TsEvent *ptsev タスクマンイベントレコードへのポインタ
* 戻り値: int num = 1: [実行]ボタン
* = 2: [取消]ボタン
*/
int eseDlgEvent(EseDlg *pese, TsEvent *ptsev)
{
int lastAP, lastFC, lastBC, lastFK;
int keyCode; /* キーコード */
int shortCut; /* ショートカットキー */
int num = 0;
int partCode; /* コントロールのパートコード */
LPoint lpt;
Control **ctrlHdl; /* コントロールハンドル */
if (!pese->visible) /* 表示されていないか? */
return 0;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_WHITE);
lastFK = GMFontKind(G_ROM12);
switch (ptsev->ts.what) {
case E_IDLE: /* アイドルイベント */
TMEventW(pese->tEditHdl, ptsev); /* カーソルを点滅させる */
break;
case E_KEYDOWN: /* キーダウンイベント */
/* ファンクションアサインテーブルによりキーコードを変換する */
keyCode = TMKeyToAsk(pese->tEditHdl, ptsev);
if (keyCode == -2) { /* テーブルに登録されてないか? */
/* OPT.1キーが押されたか? */
if (ptsev->ev.how & KS_OPT1) {
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) ptsev->ev.whom.key.ascii);
switch (shortCut) {
case 'Q': /* 終了 */
num = 2; /* [取消]ボタン */
break;
default:
/* テキストマンのショートカットに
対応する */
TMEventW(pese->tEditHdl, ptsev);
break;
}
} else {
switch (ptsev->ev.whom.key.ascii) {
case '\r': /* リターンキーかENTERキー */
num = 1; /* [実行]ボタン */
break;
case '\x1b': /* ESCキー */
num = 2; /* [取消]ボタン */
break;
default: /* その他のキー */
TMEventW(pese->tEditHdl, ptsev);
break;
}
}
} else
/* その他のキーの場合 */
TMEventW(pese->tEditHdl, ptsev);
break;
case E_MSLDOWN: /* マウスレフトダウンイベント */
/* ダイアログより外の座標は、チェックしない */
lpt = GMGlobalToLocal(ptsev->ev.where.x_y);
if (GMPtInRect(&pese->rcFrame, lpt)) {
partCode = CMFind(lpt, pese->windowPtr, &ctrlHdl);
if (ctrlHdl == pese->execBtnHdl) {
if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
num = 1; /* [実行]ボタン */
} else if (ctrlHdl == pese->canBtnHdl) {
if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
num = 2; /* [取消]ボタン */
} else
TMEventW(pese->tEditHdl, ptsev);
}
break;
case E_MSRDOWN: /* マウスライトダウンイベント */
TMEventW(pese->tEditHdl, ptsev);
break;
}
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame);
return num;
}
/******************************************************************************
* dropEseIcon(): アイコンのドロップ処理
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* TsEvent *ptsev タスクマンイベントレコードへのポインタ
* 戻り値: BOOLEAN = TRUE: ドロップ成功
* = FALSE: ドロップデータの取得に失敗
*/
BOOLEAN dropEseIcon(EseDlg *pese, TsEvent *ptsev)
{
int errCode, len;
int lastAP, lastFC, lastBC, lastFK;
BOOLEAN ret = FALSE; /* 呼び出し関数リターン値格納用 */
Drag *dragPtr; /* ドラッグポインタ */
Cell *pcell; /* セルレコードへのポインタ */
char fileName[TS_NAMEMAX]; /* ファイル名 */
errCode = TSGetDrag(&dragPtr); /* ドラッグポインタを取得する */
if (errCode < 0)
/* ドラッグレコードが無い */
return FALSE;
MMHdlLock(dragPtr->cellList); /* セルリストへのハンドルをロックする */
pcell = *dragPtr->cellList; /* セルレコードへのポインタを取得する */
TSHideDrag(); /* ラバーバンドを消去する */
/* セルレコードの情報の種類がアイコン管理レコード(上位ワードが'FS')
か? */
if (HIWORD(pcell->kind) == 'FS') {
/* アイコンは1つ(ドラッグレコードのセルリストの長さがアイコン
管理レコードを含むセルレコードの長さと同一の場合)か? */
if (dragPtr->size == sizeof(IcState) + 8 ) {
/* アイコンのフルパスを取得する */
len = TSISRecToStr((IcState *) pcell->data, fileName);
if (len >= 0) {
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_WHITE);
lastFK = GMFontKind(G_ROM12);
/* テキストエディットに挿入する */
TMInsert(pese->tEditHdl, fileName, len);
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
TSEndDrag(TS_FINISH); /* ドラッグを終了する */
ret = TRUE;
setClip(pese->windowPtr, &pese->rcFrame);
} else {
/* アイコンを元の位置にはじき飛ばして終了する */
TSEndDrag(TS_PUTBACK);
ret = FALSE;
}
} else {
/* アイコンが2つ以上か他のドラッグレコードだったら
アイコンを元の位置にはじき飛ばして終了する */
TSEndDrag(TS_PUTBACK);
ret = FALSE;
}
}
/* セルリストへのハンドルのロックを解除する */
MMHdlUnlock(dragPtr->cellList);
return ret;
}
/******************************************************************************
* getEseStr(): 文字列の取得
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* char *ptext 格納バッファへのポインタ
* 戻り値: int len < 0: エラーコード
* >= 0: 文字列の長さ
*/
int getEseStr(EseDlg *pese, char *ptext)
{
int len;
len = TMGetText(pese->tEditHdl, ptext, TS_NAMEMAX);
ptext[len] = 0;
return len;
}
/******************************************************************************
* setEseStr(): 文字列の設定
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* char *ptext 格納バッファへのポインタ
* int length 文字列の長さ
* 戻り値: int errCode < 0: エラーコード
*/
int setEseStr(EseDlg *pese, char *ptext, int length)
{
int errCode;
errCode = TMSetText(pese->tEditHdl, ptext, length);
if (pese->visible)
/* 表示されていればアップデートする */
addUpdate(pese->windowPtr, &pese->rcDest);
return errCode;
}
/******************************************************************************
* setClip(): クリッピングの設定
******************************************************************************
* 引数: Window *winPtr ウィンドウポインタ
* Rect *prc レクタングルへのポインタ
*/
void setClip(Window *winPtr, Rect *prc)
{
Region **rgnHdl;
rgnHdl = GMNewRgn();
if (rgnHdl == NULL) {
TSErrDialogN(D_CONFIRM, "メモリが確保できません。");
return;
}
GMRectRgn(rgnHdl, &winPtr->graph.rect);
GMDiffRectRgn(rgnHdl, rgnHdl, prc);
GMSetClip(rgnHdl);
GMDisposeRgn(rgnHdl); /* リージョンハンドルを解放する */
}
/******************************************************************************
* releaseClip(): クリッピングの解除
******************************************************************************
* 引数: Window *winPtr ウィンドウポインタ
*/
void releaseClip(Window *winPtr)
{
GMClipRect(&winPtr->graph.rect);
}